package com.ruoyi.common.wx;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;

public class OrderNumberGenerator {

    /**
     * 生成订单号
     *
     * @param openid 用户的openid
     * @return 不超过32个字符的订单号字符串
     */
    public static String generateOrderNumber(String openid) {
        // 获取当前时间戳并格式化为紧凑形式（去掉所有非数字字符）
        String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));

        // 使用ThreadLocalRandom来生成一定长度的随机数部分，确保线程安全
        int randomLength = 8; // 随机字符的数量，可以根据需要调整
        long randomPart = ThreadLocalRandom.current().nextLong(10000000L, 99999999L); // 生成8位随机数

        // 截取openid的一部分，如果openid过长的话。这里我们假设openid不会超过10个字符。
        String openidPart = openid != null && !openid.isEmpty() ? openid.substring(0, Math.min(openid.length(), 10)) : "";

        // 组合三个部分，并保证最终结果不超过32个字符
        StringBuilder orderNumberBuilder = new StringBuilder();
        orderNumberBuilder.append(timestamp)
                .append(randomPart)
                .append(openidPart);

        // 如果组合后的字符串超过32个字符，则进行截断
        if (orderNumberBuilder.length() > 32) {
            return orderNumberBuilder.substring(0, 32);
        } else {
            return orderNumberBuilder.toString();
        }
    }

    // 测试方法
    public static void main(String[] args) {
        String openid = "oXxxXxXxxxxXxxxxXX";
        System.out.println(generateOrderNumber(openid));
    }
}